from typing import Optional, List

from pydantic import BaseModel

from .base import OutputBase


class Participant(BaseModel):
    """
    参会人员对象
    """
    # 参会者用户 ID。
    # 使用企业自建应用鉴权方式（AK/SK）时，该值为企业唯一用户标识。
    userid: str

    # 当场会议的用户临时 ID，可用于会控操作，适用于所有用户。
    ms_open_id: str

    # 已授权用户的 ID。
    # 使用第三方应用鉴权方式（OAuth 2.0）时，该值为已授权用户的 open_id。
    # 其他情况为空。
    open_id: Optional[str]

    # 入会用户名（Base64）。
    # 若 user 是 MRA 设备，则显示为：设备名+邀请者名称+入会方式。
    user_name: str

    # 是否是企业内部成员。
    # true：企业内成员，若 userid 为空且该字段为 true 表示已离职企业成员。
    # false：非企业内成员。
    is_enterprise_user: bool

    # 参会者手机号 hash 值 SHA256（手机号 + "/" + secretid）。
    phone: str

    # 参会者加入会议时间戳（单位秒）。
    join_time: str

    # 参会者离开会议时间戳（单位秒）。
    # 如果参会者在会中，则该字段返回值为0。
    left_time: str

    instanceid: int

    # 用户角色：
    # 0：普通成员角色
    # 1：创建者角色
    # 2：主持人
    # 3：创建者+主持人
    # 4：游客
    # 5：游客+主持人
    # 6：联席主持人
    # 7：创建者+联席主持人
    user_role: int

    # 网络研讨会成员角色：
    # 0：普通参会角色
    # 1：内部嘉宾
    # 2：外部嘉宾
    # 3：邀请链接入会嘉宾
    # 4：观众
    webinar_member_role: int

    # 用户的 IP 地址。当用户在会中时才能返回。
    IP: Optional[str] = None

    # 用户的地理位置信息。当用户在会中时才能返回。
    location: Optional[str] = None

    # 用户的连接方式：UDP、TCP、未知，当用户在会中时才能返回。
    link_type: Optional[str] = None

    # 入会方式：
    # 0：PSTN 普通用户，标准的手机或固话类型
    # 1：普通 VOIP 用户
    # 2：附属投屏 VOIP
    # 3：Linux sdk for VOIP
    # 4：附属语音 PSTN
    # 5：附属视频 PSTN
    # 6：Linux sdk for PSTN
    join_type: int

    # 网络类型：有线、Wi-Fi、2G、3G、4G、未知。当用户在会中时才能返回。
    net: Optional[str] = None

    # 用户的客户端版本。当用户在会中时才能返回。
    app_version: Optional[str] = None

    # 麦克风状态：
    # true：开启
    # false：关闭
    audio_state: Optional[bool] = None

    # 摄像头状态：
    # true：开启
    # false：关闭
    video_state: Optional[bool] = None

    # 屏幕共享状态：
    # true：开启
    # false：关闭
    screen_shared_state: Optional[bool] = None

    # 用户专属字段用于生成特定入会链接，方便第三方应用识别用户身份。
    # 具体实现为：用户通过携带 customerData 的链接入会后，开发者可从“用户入会”服务端 Webhook 中获取 customer_data 字段完成身份识别
    customer_data: Optional[str] = None


class GetMeetingParticipantsData(BaseModel):
    # 会议的唯一 ID。
    meeting_id: str

    # 会议号码
    meeting_code: str

    # 会议主题。
    subject: str

    # 预定会议开始时间戳（单位秒）。
    schedule_start_time: str

    # 预定会议结束时间戳（单位秒）。
    schedule_end_time: str

    # 参会人员对象数组。
    participants: Optional[List[Participant]] = None

    # 是否还有未拉取的数据，该接口可多次拉取到的数据总量上限为5w条。
    has_remaining: bool

    # 和“has_remaining”一起，数据量比较大的情况下支持参会成员列表的多次获取。
    next_pos: Optional[int] = None

    # 当前参会总人次。
    total_count: int


class GetMeetingParticipantsOutput(OutputBase):
    data: Optional[GetMeetingParticipantsData]
